#include "dev_input.h"
#include <string.h>

/**
 * @brief 输入设备监视
 * @param pstDevice 设备句柄
 * @param pstBtn 输入设备结构体
 * @return @see Dev_Ret_t
 */
static Dev_Ret_t
dev_input_monitor(Device_t* pstDevice, Dev_Input_t* pstBtn)
{
    // 读取按键状态
    uint8_t u8NowState = pstBtn->HW.pfnRead();

    // 判断按键状态是否发生变化
    if(pstBtn->SW.u8State != u8NowState){

        // 更新状态
        pstBtn->SW.u8State = u8NowState;

        // 判断按键状态
        if(pstBtn->SW.u8State == pstBtn->SW.u8Active) 
        {
            // 输入有效事件发送
            DEV_EMIT_EVENT(pstDevice, INPUT_EVT_ACTIVE);
            return DEV_OK;
        }
    }

    return DEV_OK;
}

/**
 * @brief 输入设备控制函数
 * @param pstDevice 设备句柄
 * @param u8Cmd 命令
 * @param pvArg 参数
 * @return @see Dev_Ret_t
 */
Dev_Ret_t
dev_input_ioctl(Device_t *pstDevice, uint8_t u8Cmd, void *pvArg)
{
    (void) pvArg;

    // 转换为Dev_Input_t结构体
    Dev_Input_t *pstBtn = GET_CONTEXT(pstDevice, Dev_Input_t);

    // 接口为空
    if(NULL == pstBtn->HW.pfnRead) 
    {
        return DEV_INTERFACE_NULL;
    }

    // 执行命令
    switch(u8Cmd)
    {
        case INPUT_CMD_MONITOR:
        {   
            // 监视输入
            return dev_input_monitor(pstDevice, pstBtn);
        }

        default:
        {
            // 未知命令
            return DEV_UNKNOWN_IOCTL;
        }
    }
}
